#ifndef _FTP_CLIENT_H
#define _FTP_CLIENT_H

#include <stdio.h>
#include <sys/select.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <dirent.h>

#define PORT 5005

#define PACK_SIZE (1024 - sizeof(int) * 3)      // 包中的数据大小

// 定义一个枚举，用来标识文件传输的状态
enum MSGFLAG
{
    MSG_FILE_NAME = 1,  //文件名
    MSG_FILE_SIZE = 2,  //文件大小
    MSG_READY = 3,     //准备接受标识
    MSG_SEND = 4,      //发送
    MSG_SUCCESSED = 5, //传输成功标识
    MSG_OPEN_FAILED = 6 //文件打开失败
};

// 封装消息头
// 封装消息头
#pragma pack(1)     // 设置该结构体 1 字节对齐
typedef struct h
{
    enum MSGFLAG msg_ID;        // 当前消息的标志信息
    union Myunion
    {
        struct f{
            int file_size;              // 4
            char filename[256];         // 256
        }FILE_INFO;                 // 定义一个文件信息的结构体
        
        struct x
        {
            int pack_No;                                    // 包的编号
            int n_size;                                     // 包的大小
            char file_buf[PACK_SIZE];             // 用来存放文件
        }Packet;
    } un;
}MSG_HEAD;
#pragma pack()		//对齐结束标志

// 用于保存当前服务端的工作目录
typedef struct w
{
    char dir_name[256];
}Work_Dir;


#define BUF_SIZE 1024


// 连接ftp 服务器
// 连接成功返回 true 失败 返回 false
bool connect_to_server(void);

// 消息收发处理
// 参数说明：s 服务端的套接字文件描述符 成功后返回的文件描述符；
bool processMsg(int *clientfd);

// 向客户端发送需要下载的文件名
// 客户端会去寻找该文件并发送一条响应消息
void download_filename(int client);


// 尾准备读取的文件预留空间
void readyread(int serv_fd, MSG_HEAD *pmsg);

// 写文件
void write_file(int serv_fd, MSG_HEAD *pmsg);

// 断开与服务器的连接
void break_to_connet(int serverfd);

// // 接收服务器的工作目录
// bool recv_DIR_name(int serverfd);

// ls命令，用于显示服务端程序所在文件夹的文件
bool cmd_to_server(int serverfd, char *cmd);

// 接收 命令 得到的结果
bool get_cmd_result(int serverfd);

#endif